package com.skyhigh.web.webservice.controllers;

import java.io.File;
import java.util.Calendar;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.support.SessionStatus;

import com.skyhigh.web.webservice.domain.BodegaList;
import com.skyhigh.web.webservice.domain.Carga;
import com.skyhigh.web.webservice.domain.CategoriaMercaderiaList;
import com.skyhigh.web.webservice.domain.ContenidoFactura;
import com.skyhigh.web.webservice.domain.ContenidoFacturaList;
import com.skyhigh.web.webservice.domain.Documento;
import com.skyhigh.web.webservice.domain.Factura;
import com.skyhigh.web.webservice.services.BodegaService;
import com.skyhigh.web.webservice.services.CargaService;
import com.skyhigh.web.webservice.services.CategoriaMercaderiaService;
import com.skyhigh.web.webservice.services.ClienteService;
import com.skyhigh.web.webservice.services.ContenidoFacturaService;
import com.skyhigh.web.webservice.services.DocumentoService;
import com.skyhigh.web.webservice.services.FacturaService;
import com.skyhigh.web.webservice.services.PaisService;
import com.skyhigh.web.webservice.services.TipoMovimientoService;
import com.skyhigh.web.webservice.services.TransportistaService;

@Controller
public class CargasController {
	
	@Autowired
	private CargaService service;
	@Autowired
	private PaisService paisService;
	@Autowired
	private TipoMovimientoService tipoMovimientoService;
	@Autowired
	private TransportistaService transportistaService;
	@Autowired
	private BodegaService bodegaService;
	@Autowired
	private DocumentoService documentoService;
	@Autowired
	private ClienteService clienteService;
	@Autowired
	private FacturaService facturaService;
	@Autowired
	private ContenidoFacturaService contenidoFacturaService;

	
	private final double PRECIO_CARGA_CM_CUBICOS = 3.5;
	private final double TASA_IMPOSITIVA = 13;
	
	protected final Log logger = LogFactory.getLog(getClass());
	
	
	@RequestMapping(value="/buscarCargas.htm", method = RequestMethod.GET)
	public String desplegarFormularioBusqueda(ModelMap model){	
				
		int totalCargas = service.obtenerCartidadObjetos(); 
		int totalCargasDespachadas = service.obtenerCartidadObjetosDespachadas();		
		
		model.addAttribute("totalCargas", totalCargas);
		model.addAttribute("totalCargasDespachadas", totalCargasDespachadas);
		model.addAttribute("parametrosBusqueda", new Carga());		
		model.addAttribute("listaCargas", null);
		model.addAttribute("listaPaises", paisService.obtenerObjetos());
		model.addAttribute("listaBodegas", bodegaService.obtenerObjetos());
		model.addAttribute("listaTipoMovimientos", tipoMovimientoService.obtenerObjetos());
		model.addAttribute("listaClientes", clienteService.obtenerObjetos());
		model.addAttribute("listaTransportistas", transportistaService.obtenerObjetos());
		
		return "cargaBuscar";
	}
	
	@RequestMapping(value="/buscarCargas.htm", method = RequestMethod.POST)
	public String listarBusqueda(ModelMap model, 
			@ModelAttribute("idCarga") Integer idCarga, 
			@ModelAttribute("idPaisProcedencia") Integer idPaisProcedencia,
			@ModelAttribute("idPaisDestino") Integer idPaisDestino, 
			@ModelAttribute("idBodega") Integer idBodega,
			@ModelAttribute("idTipoMovimiento") Integer idTipoMovimiento,			
			@ModelAttribute("idDocumento") Integer idDocumento,
			@ModelAttribute("idCliente") Integer idCliente,
			@ModelAttribute("idTransportista") Integer idTransportista,			
			BindingResult result, SessionStatus status){
		
		String query = "FROM Carga WHERE idCarga is not Null ";			
		if(idCarga != 0)
			query = query + "AND idCarga = " + idCarga.toString();
		else
			query = query + "AND idCarga LIKE '%' ";
		
		if(idPaisProcedencia != 0)
			query = query + "AND idPaisProcedencia = " + idPaisProcedencia.toString();
		else
			query = query + "AND idPaisProcedencia LIKE '%' ";
		
		if(idPaisDestino != 0)
			query = query + "AND idPaisDestino = " + idPaisDestino.toString();
		else
			query = query + "AND idPaisDestino LIKE '%' ";
		
		if(idBodega != 0)
			query = query + "AND idBodega = " + idBodega.toString();
		else
			query = query + "AND idBodega LIKE '%' ";
			
		if(idTipoMovimiento != 0)
			query = query + "AND idTipoMovimiento = " + idTipoMovimiento.toString();
		else
			query = query + "AND idTipoMovimiento LIKE '%' ";
		
		if(idDocumento != 0)
			query = query + "AND idDocumento = " + idDocumento.toString();
		else
			query = query + "AND idDocumento LIKE '%' ";
		
		if(idCliente != 0)
			query = query + "AND idCliente = " + idCliente.toString();
		else
			query = query + "AND idCliente LIKE '%' ";
		
		if(idTransportista != 0)
			query = query + "AND idTransportista = " + idTransportista.toString();
		else
			query = query + "AND idTransportista LIKE '%' ";
		

		int totalCargas = service.obtenerCartidadObjetos(); 
		int totalCargasDespachadas = service.obtenerCartidadObjetosDespachadas();		
		
		model.addAttribute("totalCargas", totalCargas);
		model.addAttribute("totalCargasDespachadas", totalCargasDespachadas);
		model.addAttribute("parametrosBusqueda", new Carga());
		model.addAttribute("listaCargas", service.obtenerObjetosByConsulta(query));		
		model.addAttribute("listaPaises", paisService.obtenerObjetos());
		model.addAttribute("listaBodegas", bodegaService.obtenerObjetos());
		model.addAttribute("listaTipoMovimientos", tipoMovimientoService.obtenerObjetos());
		model.addAttribute("listaClientes", clienteService.obtenerObjetos());
		model.addAttribute("listaTransportistas", transportistaService.obtenerObjetos());
		
		return "cargaBuscar";
	}
	
	
	@RequestMapping(value="/editarCarga.htm", method = RequestMethod.GET)
	public String editarObjeto(ModelMap model, @ModelAttribute("idCarga") Integer idCarga){
		
		model.addAttribute("carga", service.obtenerObjeto(idCarga));	
		model.addAttribute("listaPaises", paisService.obtenerObjetos());
		model.addAttribute("listaBodegas", bodegaService.obtenerObjetos());
		model.addAttribute("listaTipoMovimientos", tipoMovimientoService.obtenerObjetos());
		model.addAttribute("listaDocumentos", documentoService.obtenerObjetos());
		model.addAttribute("listaClientes", clienteService.obtenerObjetos());
		model.addAttribute("listaTransportistas", transportistaService.obtenerObjetos());
		
		return "cargaEditar";
	}
	
	
	@RequestMapping(value="/guardarCargaExistente.htm", method = RequestMethod.POST)
	public String guardarObjetoExistente(ModelMap model, 
			@ModelAttribute("idCarga") Integer idCarga, 
			@ModelAttribute("idPaisProcedencia") Integer idPaisProcedencia,
			@ModelAttribute("idPaisDestino") Integer idPaisDestino, 
			@ModelAttribute("idBodega") Integer idBodega,
			@ModelAttribute("idTipoMovimiento") Integer idTipoMovimiento,			
			@ModelAttribute("idDocumento") Integer idDocumento,
			@ModelAttribute("idCliente") Integer idCliente,
			@ModelAttribute("idTransportista") Integer idTransportista, 
			@ModelAttribute("volumen") Double volumen,
			BindingResult result, SessionStatus status){
		
		
		Carga carga = service.obtenerObjeto(idCarga);
		carga.setVolumen(volumen);
		carga.setPaisProcedencia(paisService.obtenerObjeto(idPaisProcedencia));
		carga.setPaisDestino(paisService.obtenerObjeto(idPaisDestino));
		carga.setBodega(bodegaService.obtenerObjeto(idBodega));
		carga.setTipoMovimiento(tipoMovimientoService.obtenerObjeto(idTipoMovimiento));
		carga.setDocumento(documentoService.obtenerObjeto(idDocumento));
		carga.setCliente(clienteService.obtenerObjeto(idCliente));
		carga.setTransportista(transportistaService.obtenerObjeto(idTransportista));				
		service.actualizar(carga);
		
		int totalCargas = service.obtenerCartidadObjetos(); 
		int totalCargasDespachadas = service.obtenerCartidadObjetosDespachadas();		
		
		model.addAttribute("totalCargas", totalCargas);
		model.addAttribute("totalCargasDespachadas", totalCargasDespachadas);
		model.addAttribute("parametrosBusqueda", new Carga());
		model.addAttribute("listaCargas", null);	
		model.addAttribute("listaPaises", paisService.obtenerObjetos());
		model.addAttribute("listaBodegas", bodegaService.obtenerObjetos());
		model.addAttribute("listaTipoMovimientos", tipoMovimientoService.obtenerObjetos());
		model.addAttribute("listaClientes", clienteService.obtenerObjetos());
		model.addAttribute("listaTransportistas", transportistaService.obtenerObjetos());
				
		return "cargaBuscar";
	}
	
	@RequestMapping(value="/crearCarga.htm", method = RequestMethod.GET)
	public String desplegarFormularioCrearObjeto(ModelMap model){	
		
		model.addAttribute("parametrosBusqueda", new Carga());		
		model.addAttribute("listaCargas", null);
		model.addAttribute("listaPaises", paisService.obtenerObjetos());
		model.addAttribute("listaBodegas", bodegaService.obtenerObjetos());
		model.addAttribute("listaTipoMovimientos", tipoMovimientoService.obtenerObjetos());
		//model.addAttribute("listaDocumentos", documentoService.obtenerObjetos());
		model.addAttribute("listaClientes", clienteService.obtenerObjetos());
		model.addAttribute("listaTransportistas", transportistaService.obtenerObjetos());
		
		return "cargaNueva";
	}
	
	@RequestMapping(value="/guardarCargaNueva.htm", method = RequestMethod.POST)
	public String guardarObjetoNuevo(ModelMap model, 			
			@ModelAttribute("idPaisProcedencia") Integer idPaisProcedencia,
			@ModelAttribute("idPaisDestino") Integer idPaisDestino, 
			@ModelAttribute("idBodega") Integer idBodega,
			@ModelAttribute("idTipoMovimiento") Integer idTipoMovimiento,			
			@ModelAttribute("documento") File documento,
			@ModelAttribute("idCliente") Integer idCliente,
			@ModelAttribute("idTransportista") Integer idTransportista, 
			@ModelAttribute("volumen") Double volumen,
			BindingResult result, SessionStatus status){
		
		Documento nuevoDocumento = new Documento();
		nuevoDocumento.setIdMercancia(0);
		nuevoDocumento.setFechaIngreso(Calendar.getInstance().getTime());
		nuevoDocumento.setRutaArchivo(documento.getAbsolutePath());
		nuevoDocumento.setCliente(clienteService.obtenerObjeto(idCliente));
		nuevoDocumento = documentoService.agregar(nuevoDocumento);
		
		Carga carga = new Carga();
		carga.setFechaIngreso(Calendar.getInstance().getTime());
		carga.setVolumen(volumen);
		carga.setPaisProcedencia(paisService.obtenerObjeto(idPaisProcedencia));
		carga.setPaisDestino(paisService.obtenerObjeto(idPaisDestino));
		carga.setBodega(bodegaService.obtenerObjeto(idBodega));
		carga.setTipoMovimiento(tipoMovimientoService.obtenerObjeto(idTipoMovimiento));
		carga.setDocumento(nuevoDocumento);
		carga.setCliente(clienteService.obtenerObjeto(idCliente));
		carga.setTransportista(transportistaService.obtenerObjeto(idTransportista));				
		service.agregar(carga);
		
		int totalCargas = service.obtenerCartidadObjetos(); 
		int totalCargasDespachadas = service.obtenerCartidadObjetosDespachadas();		
		
		model.addAttribute("totalCargas", totalCargas);
		model.addAttribute("totalCargasDespachadas", totalCargasDespachadas);
		model.addAttribute("parametrosBusqueda", new Carga());
		model.addAttribute("listaCargas", null);	
		model.addAttribute("listaPaises", paisService.obtenerObjetos());
		model.addAttribute("listaBodegas", bodegaService.obtenerObjetos());
		model.addAttribute("listaTipoMovimientos", tipoMovimientoService.obtenerObjetos());
		model.addAttribute("listaClientes", clienteService.obtenerObjetos());
		model.addAttribute("listaTransportistas", transportistaService.obtenerObjetos());
		
		return "cargaBuscar";
	}
	
	@RequestMapping(value="/eliminarCarga.htm", method = RequestMethod.GET)
	public String eliminarObjeto(ModelMap model, @ModelAttribute("idCarga") Integer idCarga){	
		
		service.eliminar(idCarga);
		
		int totalCargas = service.obtenerCartidadObjetos(); 
		int totalCargasDespachadas = service.obtenerCartidadObjetosDespachadas();		
		
		model.addAttribute("totalCargas", totalCargas);
		model.addAttribute("totalCargasDespachadas", totalCargasDespachadas);
		model.addAttribute("parametrosBusqueda", new Carga());		
		model.addAttribute("listaCargas", null);
		model.addAttribute("listaPaises", paisService.obtenerObjetos());
		model.addAttribute("listaBodegas", bodegaService.obtenerObjetos());
		model.addAttribute("listaTipoMovimientos", tipoMovimientoService.obtenerObjetos());
		model.addAttribute("listaDocumentos", documentoService.obtenerObjetos());
		model.addAttribute("listaClientes", clienteService.obtenerObjetos());
		model.addAttribute("listaTransportistas", transportistaService.obtenerObjetos());
		
		return "cargaBuscar";
	}
	
	
	@RequestMapping(value="/despacharCarga.htm", method = RequestMethod.GET)
	public String despacharObjeto(ModelMap model, 
			@ModelAttribute("idCarga") Integer idCarga){	
		
		Carga carga = service.obtenerObjeto(idCarga);
		carga.setFechaSalida(Calendar.getInstance().getTime());	
		
		Factura factura = new Factura();
		factura.setSubtotal(carga.getVolumen() * PRECIO_CARGA_CM_CUBICOS);
		factura.setImpuestos(factura.getSubtotal()*(TASA_IMPOSITIVA/100));
		factura.setTotal(factura.getSubtotal() + factura.getImpuestos());
		factura.setFecha(Calendar.getInstance().getTime());		
		factura.setCliente(carga.getCliente());
		factura.setCategoriaMercaderia(carga.getBodega().getCategoriaMercaderia());				
		
		service.actualizar(carga);
		factura  = facturaService.agregar(factura);		
		
		ContenidoFactura contenidoFactura = new ContenidoFactura();
		contenidoFactura.setIdMercancia(carga.getBodega().getCategoriaMercaderia().getIdCategoria());
		contenidoFactura.setCosto(carga.getVolumen() * PRECIO_CARGA_CM_CUBICOS);
		contenidoFactura.setFactura(factura);
		
		contenidoFacturaService.agregar(contenidoFactura);				
		
		model.addAttribute("factura", factura);		
		model.addAttribute("carga", carga);
		model.addAttribute("isCarga", true);	
		
		return "facturaVer";
	}
	
	@RequestMapping(value="/verCarga.htm", method = RequestMethod.GET)
	public String verObjeto(ModelMap model, @ModelAttribute("idCarga") Integer idCarga){
		
		model.addAttribute("carga", service.obtenerObjeto(idCarga));	
		model.addAttribute("listaPaises", paisService.obtenerObjetos());
		model.addAttribute("listaBodegas", bodegaService.obtenerObjetos());
		model.addAttribute("listaTipoMovimientos", tipoMovimientoService.obtenerObjetos());
		model.addAttribute("listaDocumentos", documentoService.obtenerObjetos());
		model.addAttribute("listaClientes", clienteService.obtenerObjetos());
		model.addAttribute("listaTransportistas", transportistaService.obtenerObjetos());
		
		return "cargaVer";
	}
}
